home *** CD-ROM | disk | FTP | other *** search
/ Amiga News 95 / Amiga News 95.iso / dpat / dpat77 / lfgrabpath / lfgrabpath.c < prev    next >
C/C++ Source or Header  |  1994-09-09  |  6KB  |  215 lines

  1. /*
  2.  *                  LFGrabPath v1.0
  3.  *
  4.  *                      © LFSoft 1994
  5.  *
  6.  *  Purpose:
  7.  *  ~~~~~~~~
  8.  *       Grab global shell path. For use w/ shell that doesn't herite path,
  9.  *      ( shells lauched by Workbench's process, as DiceConfig 2.x slave
  10.  *      shell ).
  11.  *
  12.  *
  13.  *  Legal stuffs:
  14.  *  ~~~~~~~~~~~~~
  15.  *       This usefull tools is a CARTE-WARE that meed you *must* send me a
  16.  *      post carte to say that you like my work.
  17.  *       On the other hand, I ( Laurent FAILLIE ) don't assume any warranty
  18.  *      of any king. Use it at your only own risk.
  19.  *
  20.  *       Some parts of this code is based on my very own LFSystemBinder 1.0
  21.  *      and CSH 5.31's sources code by Andreas M. Kirchwitz.
  22.  *      CAUTION: CSH 5.xx have a bug that crach your Amiga if you do a
  23.  *      "path -gr" because global path ( stored in "WorkBench" CLI-Structure )
  24.  *      isn't allocated by DOS by AllocVec() but by a simple AllocMem(). This
  25.  *      was fixed for LFSystemBinder ...
  26.  *
  27.  *  Others:
  28.  *  ~~~~~~~
  29.  *       LFGrabPath was developped and tested on my Amiga 4000, 68040, 6Mb RAMs,
  30.  *      KS 39.106,WB 39.29, and on my old ( but lovely !! ) Amiga 1000, 68010,
  31.  *      6 Mb RAMs, KS 37.210, WB 38.35.
  32.  *
  33.  *       It was compiled using REGISTERED version of Dice ( © Matt. DILLON ),
  34.  *      v 2.07.54R, and this is a PURE commands.
  35.  *
  36.  *  Notes:
  37.  *  ~~~~~~
  38.  *      - This sources code is for information only as some aspect are Dice
  39.  *     dependant and some functions call my very own LF.lib.
  40.  *
  41.  *      - Currently, Workbench must running as global path is taken from
  42.  *     Workbench's CLI struture...
  43.  *
  44.  *  Thanks to:
  45.  *  ~~~~~~~~~~
  46.  *      - M.Dillon for Dice,
  47.  *      - SomeWare for distribution of Dice in FRANCE,
  48.  *      - My betha-testers: Frank Geider, Bruno Antoine, Animage production,
  49.  *          and Sebastien Bouchex.
  50.  *      - Andreas M. Kirchwitz for CSH 5.20+
  51.  *      - AmigaNews,
  52.  *      - and alls who registers my tools,
  53.  *      - Fred Fish & CAM for DPs libraries,
  54.  *      - Couleur3 for music
  55.  *
  56.  *      A very BIG TANKS to BABETH...
  57.  *
  58.  *  DEBUG:
  59.  *  ~~~~~~
  60.  *      9 Doesn't touch our path
  61.  *      8 Display global path
  62.  *
  63.  *      Warning : If DEBUG > 7, multitaching is enabled when we are looking for
  64.  *          the workbench's path. The system may crach if another process modify
  65.  *          path list (ether our path or workbench's path) at the same time.
  66.  *
  67.  *  History:
  68.  *  ~~~~~~~~
  69.  *      22/07/1994: First Version
  70.  *
  71.  *  Write to:
  72.  *  ~~~~~~~~~
  73.  *           Laurent FAILLIE
  74.  *            "Les Vuardes"
  75.  *          74930 Pers-Jussy
  76.  *              FRANCE
  77.  *
  78.  *          ------< Sorry for my (very ?) bad english >-----
  79.  */
  80.  
  81. #include <LF.h>     // For my very own LF.lib
  82. #include <string.h>
  83. #include <stdio.h>
  84. #include <fcntl.h>
  85. #include <exec/memory.h>
  86. #include <dos/dosextens.h>
  87. #include <proto/dos.h>
  88. #include <dos/dostags.h>
  89. #include <clib/alib_protos.h>
  90. #include <proto/exec.h>
  91.  
  92. void OS2_0( void ); // Because this function isn't prototyped anywhere !!
  93.  
  94. struct PathList {           // From CSH 5.31 source's code
  95.         BPTR pl_NextPath;
  96.         BPTR pl_PathLock;
  97. };
  98. #define BPTR_TO_C(strtag, var)  ((struct strtag *)(BADDR( (ULONG) var)))
  99. #define CLI(proc)               (BPTR_TO_C(CommandLineInterface, proc->pr_CLI))
  100.  
  101.  
  102. struct CommandLineInterface *ourcli;
  103.  
  104. BOOL adddir(BPTR np){
  105.     /* Add given dir to our path
  106.      * Fail if this dir is already in the path ...
  107.      */
  108.  
  109.     struct PathList *pl,*last,*new_pl;
  110.     BPTR dup_lock;
  111.  
  112.     if(!(dup_lock = DupLock(np))){
  113.         puts(" Error: Can't duplicate a Lock ( no mémories ? )");
  114.         exit(10);
  115.     }
  116.  
  117.  
  118.             /*  Look for the end of our PathList and test if this entry
  119.              * isn't already included.
  120.              */
  121.  
  122.     last = pl = BPTR_TO_C(PathList,ourcli->cli_CommandDir);
  123.     while(pl){
  124.         last = pl;
  125.         if (pl->pl_PathLock) {
  126.             if (SameLock(pl->pl_PathLock,dup_lock)==LOCK_SAME) {
  127.                 UnLock(dup_lock);
  128.                 #if DEBUG > 7
  129.                     puts(" already in path list !!");
  130.                 #endif
  131.                 return FALSE;
  132.             }
  133.         }
  134.         pl = (struct PathList *)BADDR(pl->pl_NextPath);
  135.     }
  136.  
  137.     #if DEBUG > 7
  138.         puts(" added .");
  139.     #endif
  140.  
  141.     #if DEBUG < 9   // Don't touch our path if DEBUG == 9
  142.  
  143.  
  144.             /* Allocate and add this new entry */
  145.  
  146.     if (new_pl=AllocVec(sizeof(struct PathList),MEMF_CLEAR|MEMF_PUBLIC)) {
  147.         new_pl->pl_NextPath = NULL;
  148.         new_pl->pl_PathLock = dup_lock;
  149.         if (last)
  150.             last->pl_NextPath = MKBADDR(new_pl);
  151.         else
  152.             ourcli->cli_CommandDir = MKBADDR(new_pl);
  153.         return TRUE;
  154.     } else  // Can't allocate a new entry
  155.         UnLock(dup_lock);
  156.     #endif
  157.  
  158.     return FALSE;
  159. }
  160.  
  161. void main( void ){
  162.     struct PathList *pl;
  163.     struct Process *wbench;
  164.  
  165.     puts("\tLFGrabPath 1.0 © LFSoft 1994\n Grab the system's global path stored in the WorkBench Structure...");
  166.     OS2_0();    // Exit if not runing on 2.0+
  167.  
  168.         /* Get our CLI */
  169.     if(!(ourcli = Cli())){
  170.         puts("Error : Can't take our CLI structure");
  171.         exit(10);
  172.     }
  173.  
  174.         /* Find Workbench, where global path is stored */
  175.     Forbid();
  176.  
  177.     if(!(wbench=(struct Process *)FindTask("Workbench"))){
  178.         Permit();
  179.         fputs("Can't find WorkBench",stderr);
  180.         exit(10);
  181.     }
  182.  
  183.     if(!wbench->pr_CLI){
  184.         Permit();
  185.         fputs("WorkBench doesn't have a CLI struture !!",stderr);
  186.         exit(10);
  187.     }
  188.  
  189.     pl=(struct PathList *)BADDR(CLI(wbench)->cli_CommandDir);
  190.  
  191.     #if DEBUG > 7
  192.         Permit();
  193.     #endif
  194.  
  195.     while (pl) {
  196.             if (pl->pl_PathLock) {
  197.                     #if DEBUG > 7
  198.                         char buf[256];
  199.  
  200.                         NameFromLock(pl->pl_PathLock,buf,255L);
  201.                         printf("%s ",buf);
  202.                     #endif
  203.  
  204.                     adddir(pl->pl_PathLock);
  205.             }
  206.             pl = (struct PathList *)BADDR(pl->pl_NextPath);
  207.     }
  208.  
  209.     #if DEBUG < 8
  210.         Permit();
  211.     #else
  212.         putchar('\n');
  213.     #endif
  214. }
  215.